package queue;

/**
 * Created by IntelliJ IDEA.
 * User: 杰哥
 * Date: 2020/3/24
 * Time: 16:34
 */
public class CircleArrayQueueDemo {
}

/**
 * 环形队列
 */
class CircleArray {
    private int maxSize;  // 表示数组最大的容量
    private int front;    // 指向队列的第一个元素的下标
    private int rear;     // 指向队列的最后一个元素的后一位的下标
    private int[] arr;    // 该数据用于存放数据，模拟队列

    public  CircleArray (int arrMaxSize) {
        maxSize = arrMaxSize;
        arr = new int[maxSize];
    }

    /**
     * 判断队列 是否满
     * 数组arr默认最后一个为空，所以数组arr只有最后一个为空时则表示队列满了
     */
    public boolean isFull() {
        return (rear+1) % maxSize == front;
    }
    /**
     * 判断队列是否为空
     */
    public boolean isEmpty() {
        return rear == front;
    }
    /**
     * 添加数据到队列
     */
    public void addQueu(int n) {
        //判断队列是否满
        if(isEmpty()) {
            System.err.println("队列满，不能加入数据");
            return;
        }
        //先将数据给加入
        arr[rear] = n;
        //将rear后移，这里必须考虑取模
        rear = (rear + 1) % maxSize;
    }
    /**
     * 获取队列的数据，出队列
     */
    public int getQueue() {
        //判断队列是否空
        if(isEmpty()) {
            throw new RuntimeException("队列空，不能取数据");
        }
        //1.先将front 对应的值保留到一个临时的变量
        int value = arr[front];
        //2.将front 后移
        front = (front + 1) % maxSize;
        // 3.将临时保存的变量返回
        return value;
    }
    /**
     * 显示队列所以数据
     */
    public void  showQueue() {
        if(isEmpty()) {
            System.err.println("队列空的，没有数据");
            return;
        }
        for(int i = front; i < front + validSize(); i++) {
            System.out.println("arr["+i % maxSize+"]="+arr[i % maxSize]+"\n");
        }
    }

    /**
     * 求出当前队列有效数据的个数
     */
    public int validSize() {
        return (rear - front + maxSize) % maxSize;
        //这里可以写成返回 maxSize减去 rear-front的绝对值;Math.abs();
    }
    /**
     * 显示队列的第一个数据，注意不是取出数据
     */
    public int headQueue() {
        if(isEmpty()) {
            System.err.println("队列空的，没有数据");
            throw new RuntimeException("队列为空，没有数据");
        }
        return arr[front];
    }


}